package StudentSysterm;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class login {
    public static void main(String[] args) {
        ArrayList<User> list=new ArrayList<>();
        Scanner sc=new Scanner(System.in);
        do{
            menu();
            System.out.println("请选择");
            String choice=sc.next();
            switch(choice){
                case "1":
                    signin(list);
                    break;
                case "2":
                    register(list);

                    break;
                case "3":
                    forgetpassword(list);
                    break;
                default:
                    System.out.println("输入有误，请重新输入");
                    break;
            }
        }while(true);
    }
    //菜单
    public static void menu(){
        System.out.println("---------------------------------------------");
        System.out.println("-----1.登录-----2.注册-----3.忘记密码----------");
        System.out.println("---------------------------------------------");
    }
    //注册
    public static void register(ArrayList<User> list){
        Scanner sc=new Scanner(System.in);
        //1.创建对象
        User u1=new User();
        //2.录入信息到对象中

        ///////////////////////////用户名
        //2.1.1.键盘输入用户名
        while(true){
            System.out.println("请输入用户名");
            String newname=sc.next();
            //2.1.2.判断用户名唯一性
            boolean flag_contain=contain(list,newname);
            if(flag_contain==true){
                System.out.println(newname+"用户名已重复，请重新输入");
                continue;
            }
            //2.1.3.判断长度在3-15位
            if(newname.length()<3||newname.length()>15){
                System.out.println(newname+"用户名长度不符合要求");
                continue;
            }
            //2.1.4.只能数字加字母，但不能纯数字
            boolean flag_len=len(newname);
            if(flag_len==false){
                System.out.println(newname+"用户名格式不正确");
                continue;
            }
            else{
                //2.1.5.录入信息到对象中
                u1.setUsername(newname);
                break;
            }
        }
        ///////////////////////////密码
        while(true){
            //2.2.1.键盘输入两次密码
            System.out.println("请输入密码");
            String newword1=sc.next();
            System.out.println("请输入第二次密码");
            String newword2=sc.next();
            //2.2.2.比较两次密码
            if(newword1.equals(newword2)){
                //2.2.3.录入信息到对象中
                u1.setPassword(newword1);
                break;
            }
            else{
                System.out.println("两次密码输入不一致，请重新输入");
                continue;
            }
        }
        ///////////////////////////身份证号码
        while(true){
            //2.3.1.键盘输入号码
            System.out.println("请输入身份证号码");
            String newid=sc.next();
            //2.3.2.判断首字符是否为‘0’
            if(newid.charAt(0)=='0'){
                System.out.println(newid+"首数字不能为0，请重新输入");
                continue;
            }
            //2.3.3.判断长度
            if(newid.length()!=18){
                System.out.println(newid+"长度不符合要求，请重新输入");
                continue;
            }
            //2.3.4.末尾可以是数字，也可以是x/X
            if((newid.charAt(newid.length()-1)=='x'&&newid.charAt(newid.length()-1)=='X')
                    ||(newid.charAt(17)>='0'&&newid.charAt(17)<='9')){
            //2.3.5.录入信息到对象中
                u1.setPersonid(newid);
                break;
            }
            else{
                System.out.println(newid+"末尾数字不符合要求，请重新输入");
                continue;
            }
        }
        ///////////////////////////手机
        while(true){
            System.out.println("请输入手机号码");
            //2.4.1.键盘录入信息
            String newphone=sc.next();
            //2.4.2.判断是否以“0”开头
            if(newphone.charAt(0)=='0'){
                System.out.println(newphone+"首数字不能为0，请重新输入");
                continue;
            }
            //2.4.3.判断长度
            if(newphone.length()!=11){
                System.out.println(newphone+"长度不符合要求，请重新输入");
                continue;
            }
            //2.4.4.必须都是数字
            boolean flag_phone=phone_len(newphone);
            if(flag_phone==true){
            //2.4.5.录入信息到对象中
                u1.setPhonenumber(newphone);
                break;
            }
            else{
                System.out.println(newphone+"必须全是数字，请重新输入");
                continue;
            }
        }

        //3.录入信息到集合中
        list.add(u1);
        System.out.println("注册成功");


    }

    //判断用户名唯一性
    private static boolean contain(ArrayList<User> list,String newname){
        for (int i = 0; i < list.size(); i++) {
            String name=list.get(i).getUsername();
            if(newname.equals(name)){
                return true;
            }
        }
        return false;
    }
    //只能数字加字母，但不能纯数字
    private static boolean len(String newname){
        //统计数字
        int count =0;
        for (int i = 0; i < newname.length(); i++) {
            char c = newname.charAt(i);
            if((c>='a'&&c<='z')||(c>='A'&&c<='Z')||(c>='0'&&c<='9')){
                            ;
            }
            else{
                return false;
            }
        }
        for (int i = 0; i < newname.length(); i++) {
            char c = newname.charAt(i);
            if(c>='0' && c<='9'){
                count++;
            }
        }
        if(count<newname.length()){
            return true;
        }
        else{
            return false;
        }
    }
    //判断手机号码是否都为数字
    public static boolean phone_len(String newphone){
        int count=0;
        for (int i = 0; i < newphone.length(); i++) {
            if(newphone.charAt(i)>='0'&&newphone.charAt(i)<='9'){
                count++;
            }
        }
        if(count<11){
            return false;
        }
        else{
            return true;
        }
    }
    ///////////////////登录
    public static void signin(ArrayList<User> list){
        Scanner sc=new Scanner(System.in);
        int j=0;
        while(true){
            //1.键盘录入用户名
            System.out.println("请输入用户名");
            String newname=sc.next();
            //2.遍历验证用户名
             j=check(list,newname);
            if(j<0){
                System.out.println("用户未注册");
                continue;
            }
            else{
                break;
            }
        }

        for(int i=0;i<3;i++){
            //3.录入密码
            System.out.println("请输入密码");
            String newpassword=sc.next();
            //4.验证密码
            if(list.get(j).getPassword().equals(newpassword)){
                break;
            }
            else{
                if(i==2){
                    System.out.println("该账户已被锁定");
                    System.exit(0);//结束整段程序
                }
                else{
                    System.out.println("密码错误，还有"+(2-i)+"次机会");
                }
            }
        }
        //5.生成并打印验证码
        String result=checkcode();
        System.out.println(result);
        //5.1键盘录入验证码
        System.out.println("请输入验证码");
        String code=sc.next();
        //6.验证验证码
        if(code.equals(result)){
            //打印登陆成功
            System.out.println("登陆成功");
        }
    }
    //////////////////////////////////忘记密码
    public static void forgetpassword(ArrayList<User> list){
        Scanner sc=new Scanner(System.in);
        //1.判断用户名是否存在
        //1.1输入用户名
        System.out.println("请输入用户名");
        String newname=sc.next();
        int j=check(list,newname);
        //1.2判断
        while(true){
            if(j>=0){
                break;
            }
            else{
                System.out.println("用户不存在");
                System.exit(0);//停止虚拟机运行
            }
        }
        //2.判断身份证和电话是否正确
        //2.1输入信息
        System.out.println("请输入身份证号码");
        String newid=sc.next();
        System.out.println("请输入电话号码");
        String newphone=sc.next();
        //2.2判断
        if(newid.equals(list.get(j).getPersonid())){


        }
        else{
            System.out.println("身份证号码有误");
            System.exit(0);//停止虚拟机运行
        }
        if(newphone.equals(list.get(j).getPhonenumber())){
            //3.修改密码
            System.out.println("请输入修改后的密码");
            String newword=sc.next();
            list.get(j).setPersonid(newword);
            System.out.println("修改成功");
        }
        else{
            System.out.println("电话号码有误");
            System.exit(0);//停止虚拟机运行
        }

    }
    //验证用户名是否存在
    public static int check(ArrayList<User> list,String newname){
        for (int i = 0; i < list.size(); i++) {
            String name = list.get(i).getUsername();
            if (newname.equals(name)) {
                return i;
            }
        }
        return -1;
    }
    //生成验证码
    public static String checkcode(){
        Random r=new Random();
        char[] arr=new char[5];
        char[] arr2=new char[52];

        //需求5位：一位数字和4位字母
        //1.生成5个字母的字符数组
        //1.1字母数组
        for (int i = 0; i < 52; i++) {
            if(i<26){
                arr2[i]=(char)(65+i);
            }
            if(i>25){
                arr2[i]=(char)(97+i-26);
            }
        }
        //1.2生成5个字母的字符数组
        for (int i = 0; i < 5; i++) {
            int pos=r.nextInt(52);
            arr[i]=arr2[pos];

        }
        //2.生成一个数字并转换成字符
        int num=r.nextInt(10);
        char c=(char)(num+48);
        //3.把数字随机替代字母
        int pos=r.nextInt(5);
        arr[pos]=c;
        //4.把字符数组转换成字符串
        String result=new String(arr);
        return result;
    }

}
